#include <iostream>
#include <memory>
#include <vector>

class Base_AST
{
public:
    explicit Base_AST(int id) : d_id(id) {}
    virtual std::unique_ptr<Base_AST> copy() const = 0;
    virtual void solve(std::vector<Base_AST> &ASTs) = 0; // 求解函数
    int get_id() const { return d_id; }

private:
    int d_id;
};
class AST_node : public virtual Base_AST
{
public:
    // 非叶子节点
    AST_node(std::unique_ptr<Base_AST> left, std::unique_ptr<Base_AST> right) : Base_AST(-1), d_left(std::move(left)), d_right(std::move(right)) {}
    // 叶子节点
    explicit AST_node(int id) : Base_AST(id), d_left(nullptr), d_right(nullptr) {}
    // 拷贝
    AST_node(const AST_node &rhs) : Base_AST(rhs.get_id()), d_left(rhs.d_left ? rhs.d_left->copy() : nullptr), d_right(rhs.d_right ? rhs.d_right->copy() : nullptr) {}
    // 移动
    AST_node(AST_node &&rhs) noexcept : Base_AST(rhs.get_id()), d_left(std::move(rhs.d_left)), d_right(std::move(rhs.d_right)) {}
    
    std::unique_ptr<AST_node> copy() const override { return std::make_unique<AST_node>(*this); }

// std::unique_ptr<Base_AST> copy() const override { 
//     return std::make_unique<AST_node>(*this); 
// }

// std::unique_ptr<AST_node> copy() const override { 
//     return std::unique_ptr<AST_node>(new AST_node(*this));
// }

    void solve(std::vector<AST_node> &ASTs) {} // 求解函数

private:
    std::unique_ptr<Base_AST> d_left;
    std::unique_ptr<Base_AST> d_right;
};
int main()
{
}